/****************************************************************
 ** Nombre: GestorDeAsignaturasAlumno.java                      *
 ** Version: 1.1.0                                              *
 ** Diagrama: GAPI v1.5.2                                       *
 ** Autor: Luis Jorge Uicab Azcorra                             *
 ** Creado: 25-mar-2013                                         *
 ** Modificado: 13-abr-2013                                     *
 ****************************************************************/
package Servicios;

import DAO.*;
import Dominio.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * @author Luis J
 * Description: Servicio que se encarga de ejecutar las acciones relacionadas
 * con las Asignaturas del Alumno
 * Date: 23/03/2013
 */
public class GestorDeAsignaturasAlumno extends HttpServlet{
    private final String ID_GUARDAR_DATOS_ASIGNATURAS_ALUMNO = "guardarDatosAsignaturasAlumno";
    private final String ID_OBTENER_PROFESORES = "obtenerProfesores";
    private final String ID_OBTENER_PROFESORES_OPTATIVA = "obtenerProfesoresOptativa";
    private final String ID_OBTENER_FORMULARIO_GUARDADO = "obtenerFormularioGuardado";
    
    private DAOProfesor daoP = new DAOProfesor();
    private DAOInformacionAlumno daoIA = new DAOInformacionAlumno();
    private DAORelacionAlumnoProgramaEducativo daoR = new DAORelacionAlumnoProgramaEducativo();
    private DAOAsignaturasAlumno daoAA = new DAOAsignaturasAlumno();
    DAOAsignaturasOptativasAlumno daoAOA = new DAOAsignaturasOptativasAlumno();
    
    /**
     * Metodo Get del Servicio
     * @param request La solicitud
     * @param response La Respuesta
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) {
        processRequest(request, response);
    }

    /**
     * Metodo Post del Servicio
     * @param request La solicitud
     * @param response La Respuesta
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) {
        processRequest(request, response);
    }
    
    /**
     * Metodo que se encarga de procesar la solicitud del usuario
     * @param request La solicitud
     * @param response La Respuesta
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) {
        String peticion = request.getParameter("id");
        if(peticion != null){
            switch (peticion) {
                case ID_GUARDAR_DATOS_ASIGNATURAS_ALUMNO:
                    guardarDatosAsignaturas(request, response);
                    break;
                case ID_OBTENER_PROFESORES:
                    obtenerProfesores(request, response);
                    break;
                case ID_OBTENER_PROFESORES_OPTATIVA:
                    obtenerProfesoresOptativa(request, response);
                    break;
                case ID_OBTENER_FORMULARIO_GUARDADO:
                    obtenerFormularioGuardado(request, response);
                    break;
            }
        } else {
            PrintWriter out = null;
            try {
                out = response.getWriter();
                out.println("Ocurri&oacute; un error al procesar la petici&oacute;n");
            } catch (IOException ex) {                
                out.println("Ocurri&oacute; un error al procesar la petici&oacute;n");
            } finally {
                out.close();
            }
        }
    }
    
    /**
     * Metodo encargado de guardar las asignaturas de tipo AsignaturasAlumno en
     * la base de Datos. Si la Asignatura No existe en la BD la Crea. Si la
     * Asignatura ya existe en la BD, la Actualiza.
     * @param request La solicitud
     * @param response La Respuesta
     */
    private void guardarDatosAsignaturas(HttpServletRequest request, HttpServletResponse response){
        PrintWriter out=null;
        try {
            response.setContentType("text/html;charset=UTF-8");
            out = response.getWriter();
            
            HttpSession sesion = request.getSession();
            sesion.setAttribute("asignaturas", null);
        
            daoIA = new DAOInformacionAlumno();
            daoR = new DAORelacionAlumnoProgramaEducativo();
            daoAA = new DAOAsignaturasAlumno();
            
            String nombreDeUsuario = (String)request.getSession().getAttribute("nombreUsuario");
            int claveInfoAlumno = daoIA.obtenerClaveInfoAlumno(nombreDeUsuario);
            ProgramaEducativo programaEducativo = (ProgramaEducativo)daoR.getProgramaEducativoAlumno(claveInfoAlumno);
            ArrayList<Semestre> semestres = programaEducativo.getReticula().getListaDeSemestres();
            
            DAORelacionAlumnoProgramaEducativo daoAPE = new DAORelacionAlumnoProgramaEducativo();
            int claveRelacionAlumnoPE = daoAPE.obtenerClaveRelacion(claveInfoAlumno, programaEducativo.getCvePrograma());
            daoAPE.cerrarConexionARelacionAlumnoProgramaEducativo();

            for(int i = 0; i<semestres.size(); i++){
                int j;
                for(j=0; j<semestres.get(i).getListaDeAsignaturas().size(); j++){
                    String id = i + "/" + j;// "Numero de Semestre/Numero de Asignatura"
                    int claveAsignatura = semestres.get(i).getListaDeAsignaturas().get(j).getClaveAsignatura();
                    AsignaturaAlumno asignatura = daoAA.obtenerAsignaturaAlumno(claveInfoAlumno, programaEducativo.getCvePrograma(), claveAsignatura, semestres.get(i).getClaveSemestre());
                    int estado = Integer.parseInt(request.getParameter(id));

                    DAOAsignaturaReticula daoAR = new DAOAsignaturaReticula();
                    int claveAsignaturaReticula = daoAR.obtenerClaveAsignaturaSemestre(claveAsignatura, semestres.get(i).getClaveSemestre());
                    daoAR.cerrarConexionAAsignaturaReticula();
                    if(asignatura!=null){
                        //Actualizamos
                        int claveMaestro = -1;
                        if(estado==0 || estado==1 || estado==2){
                            claveMaestro = Integer.parseInt(request.getParameter("profesor"+id));
                        }
                        daoAA.actualizarAsignaturaAlumno(asignatura.getClaveAsignaturaAlumno(), claveRelacionAlumnoPE, claveAsignaturaReticula, claveMaestro, estado);
                    } else {
                        //Agregamos
                        int claveMaestro = -1;
                        if(estado==0 || estado== 1 || estado==2){
                            claveMaestro = Integer.parseInt(request.getParameter("profesor"+id));
                        }
                        daoAA.registrarAsignaturaAlumno(claveRelacionAlumnoPE, claveAsignaturaReticula, claveMaestro, estado);
                    }
                }
            }
            //Optativas
            daoAOA = new DAOAsignaturasOptativasAlumno();
            ArrayList<AsignaturaOptativa> optativas = programaEducativo.getReticula().getAsignaturasOptativas();
            for(int i = 0; i<optativas.size(); i++){
                
                int claveAsignatura = optativas.get(i).getClaveAsignatura();
                
                DAOAsignaturaOptativa daoAsignaturaOptativa = new DAOAsignaturaOptativa();                
                int claveAsignaturaOptativa = daoAsignaturaOptativa.obtenerClaveAsignaturaOptativa(claveAsignatura, programaEducativo.getCvePrograma());
                daoAsignaturaOptativa.cerrarConexionAAsignaturaOptativa();
                
                String idOptativa = "op"+i;
                AsignaturaOptativaAlumno actual = daoAOA.obtenerAsignaturaAlumno(claveInfoAlumno, programaEducativo.getCvePrograma(), claveAsignaturaOptativa);
                int estadoO = Integer.parseInt(request.getParameter(idOptativa));

                                                                
                if(actual!=null){
                    //Actualizamos
                    int claveMaestroOp = -1;
                    if(estadoO==0 || estadoO==1 || estadoO==2){
                        claveMaestroOp = Integer.parseInt(request.getParameter("profesor"+idOptativa));
                    }
                    daoAOA.actualizarAsignaturaAlumno(actual.getClaveAsignaturaOptativaAlumno(), claveRelacionAlumnoPE, claveAsignaturaOptativa, claveMaestroOp, estadoO);
                } else {
                    //Agregamos
                    //Actualizamos
                    int claveMaestroOp = -1;
                    if(estadoO==0 || estadoO==1 || estadoO==2){
                        claveMaestroOp = Integer.parseInt(request.getParameter("profesor"+idOptativa));
                    }
                    daoAOA.registrarAsignaturaOptativaAlumno(claveRelacionAlumnoPE, claveAsignaturaOptativa, claveMaestroOp, estadoO);
                }
            }
            out.println("Asignatura Registrada con &eacute;xito");
        } catch (IOException | NumberFormatException ex) {
            out.println(ex.getMessage());
        } finally {
            out.close();
        }
    }
    
    /**
     * Metodo encargado de obtener la lista de profesores a ser desplegada
     * dentro de el respectivo selector.
     * @param request La Solicitud
     * @param response La Respuesta
     */
    private void obtenerProfesores(HttpServletRequest request, HttpServletResponse response){
        String nombreDeUsuario = (String)request.getSession().getAttribute("nombreUsuario");
        int semestre = Integer.parseInt(request.getParameter("semestre"));
        int asignatura = Integer.parseInt(request.getParameter("asignatura"));
        
        daoP = new DAOProfesor();
        daoIA = new DAOInformacionAlumno();
        daoR = new DAORelacionAlumnoProgramaEducativo();
        daoAA = new DAOAsignaturasAlumno();
        
        ArrayList<Profesor> profesores = daoP.buscarTodosLosProfesores();
        int claveInfoAlumno = daoIA.obtenerClaveInfoAlumno(nombreDeUsuario);
        ProgramaEducativo programaEducativo = (ProgramaEducativo)daoR.getProgramaEducativoAlumno(claveInfoAlumno);
        ArrayList<Semestre> semestres = programaEducativo.getReticula().getListaDeSemestres();
        int claveAsignatura = semestres.get(semestre).getListaDeAsignaturas().get(asignatura).getClaveAsignatura();
        AsignaturaAlumno asignaturaAlumno = daoAA.obtenerAsignaturaAlumno(claveInfoAlumno, programaEducativo.getCvePrograma(), claveAsignatura, semestres.get(semestre).getClaveSemestre());
        
        
        String selector = "";
        selector += "<select name=\"selectorProfesor\" id=\"selectorProfesor"+semestre+"/"+asignatura+"\">";
        for(int i = 0; i < profesores.size(); i++){
            String nombreProfesor = profesores.get(i).getNombre();
            int claveProfesor = profesores.get(i).getClaveProfesor();
            selector += "<option value=\""+claveProfesor+"\"";
            
            if(asignaturaAlumno != null) {
                if(claveProfesor == asignaturaAlumno.getClaveProfesor()){
                    selector += "SELECTED";
                }
            }
            selector += ">"+nombreProfesor.toUpperCase()+"</option>";
        }
        
        
        daoP.cerrarConexionAProfesor();
        daoIA.cerrarConexionADAOInformacionAlumno();
        daoR.cerrarConexionARelacionAlumnoProgramaEducativo();
        daoAA.cerrarConexionAAsignaturaAlumno();
        
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out=null;
        try {
            out = response.getWriter();
            out.println(selector);
        } catch (IOException | NumberFormatException ex) {
            out.println(ex.getMessage());
        } finally {
            out.close();
        }
    }
    
    /**
     * Metodo encargado de obtener la lista de profesores a ser desplegada
     * dentro de el respectivo selector.
     * @param request La Solicitud
     * @param response La Respuesta
     */
    private void obtenerProfesoresOptativa(HttpServletRequest request, HttpServletResponse response){
        String nombreDeUsuario = (String)request.getSession().getAttribute("nombreUsuario");
        int asignatura = Integer.parseInt(request.getParameter("asignatura"));
        
        daoP = new DAOProfesor();
        daoIA = new DAOInformacionAlumno();
        daoR = new DAORelacionAlumnoProgramaEducativo();
        daoAOA = new DAOAsignaturasOptativasAlumno();
        
        ArrayList<Profesor> profesores = daoP.buscarTodosLosProfesores();
        int claveInfoAlumno = daoIA.obtenerClaveInfoAlumno(nombreDeUsuario);
        ProgramaEducativo programaEducativo = (ProgramaEducativo)daoR.getProgramaEducativoAlumno(claveInfoAlumno);
        ArrayList<AsignaturaOptativa> optativas = programaEducativo.getReticula().getAsignaturasOptativas();
        int claveAsignatura = optativas.get(asignatura).getClaveAsignatura();
        AsignaturaOptativaAlumno asignaturaAlumno = daoAOA.obtenerAsignaturaAlumno(claveInfoAlumno, programaEducativo.getCvePrograma(), claveAsignatura);
        
        String selector = "";
        selector += "<select name=\"selectorProfesor\" id=\"selectorProfesorop"+asignatura+"\">";
        for(int i = 0; i < profesores.size(); i++){
            String nombreProfesor = profesores.get(i).getNombre();
            int claveProfesor = profesores.get(i).getClaveProfesor();
            selector += "<option value=\""+claveProfesor+"\"";
            if(asignaturaAlumno != null) {
            if(claveProfesor == asignaturaAlumno.getClaveProfesor()){
                selector += "SELECTED";
            }
            }
            selector += ">"+nombreProfesor.toUpperCase()+"</option>";
        }
        
        daoP.cerrarConexionAProfesor();
        daoIA.cerrarConexionADAOInformacionAlumno();
        daoR.cerrarConexionARelacionAlumnoProgramaEducativo();
        daoAOA.cerrarConexionAAsignaturaOptativaAlumno();
        
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out=null;
        try {
            out = response.getWriter();
            out.println(selector);
        } catch (IOException | NumberFormatException ex) {
            out.println(ex.getMessage());
        } finally {
            out.close();
        }
    }
    
    /**
     * Metodo encargado de obtener el formulario a ser desplegado
     * para que el alumno seleccione el estado actual de las materias.
     * @param request La Solicitud
     * @param response La Respuesta
     */
    private void obtenerFormularioGuardado(HttpServletRequest request, HttpServletResponse response){
        HttpSession sesionOk = request.getSession();
        String nombreDeUsuario = (String)sesionOk.getAttribute("nombreUsuario");
        String formularioRegistro = "<div class=\"scroll\">";
        
        DAOInformacionAlumno daoIA = new DAOInformacionAlumno();
        int claveInfoAlumno = daoIA.obtenerClaveInfoAlumno(nombreDeUsuario);
        DAORelacionAlumnoProgramaEducativo daoR = new DAORelacionAlumnoProgramaEducativo();
        ProgramaEducativo programaEducativo = (ProgramaEducativo)daoR.getProgramaEducativoAlumno(claveInfoAlumno);
        ArrayList<Semestre> semestres = programaEducativo.getReticula().getListaDeSemestres();
        int tamMaximo = 0;
        int numSemestres = semestres.size();
        for(int j = 0; j<numSemestres; j++){
            if(semestres.get(j).getListaDeAsignaturas().size()>tamMaximo){
                tamMaximo = semestres.get(j).getListaDeAsignaturas().size();
            }
        }
        formularioRegistro +=                 
"            <h1>Seleccion de Estados para Asignaturas</h1>\n" +
"                <h3>Estados:</h3>\n" +
"                <p>\n" +
"                    Aprobada - Asignatura que fue cursada y Aprobada por el Alumno<br>\n" +
"                    Recursable - Asignatura que fue cursada una vez y fue reprobada<br>\n" +
"                    No cursable - Asignatura que fue cursada dos veces y fue reprobada<br>\n" +
"                    Cursable - Asignaura que No ha sido cursada\n" +
"                </p>\n" +
"                <h2>Tabla de Semestres</h2>\n" +
"                <table class=\"estiloAsignaturasAlumno\" border=\"1\" cellpadding=\"10\" id=\"tablaSemestres\" columnas=\""+numSemestres+"\" filas=\""+tamMaximo+"\">\n" +
"                    <tr>\n";
        
        for(int sem=0; sem<semestres.size();sem++){
                    String numSemestre = "Semestre " + (sem+1);           
                    formularioRegistro += 
"                        <th colspan=\"2\">\n" +
"                            "+numSemestre+"\n" +
"                        </th>\n";
        }
        formularioRegistro += "                    </tr>\n";
        
        DAOAsignaturasAlumno daoAA = new DAOAsignaturasAlumno();
        DAOProfesor daoP = new DAOProfesor();
        ArrayList<Profesor> profesores = daoP.buscarTodosLosProfesores();
        for(int i = 0; i<tamMaximo; i++){
            formularioRegistro += "                    <tr>\n";
            for(int j = 0; j<semestres.size(); j++){
                if(semestres.get(j).getListaDeAsignaturas().size()<=i){
                    formularioRegistro += "<td colspan=\"2\"></td>\n";
                } else{
                    String nombreAsignatura = semestres.get(j).getListaDeAsignaturas().get(i).getNombre();
                    String id = j + "/" + i;// "Numero de Semestre/Numero de Asignatura"
                    int claveAsignatura = semestres.get(j).getListaDeAsignaturas().get(i).getClaveAsignatura();
                    AsignaturaAlumno asignatura = daoAA.obtenerAsignaturaAlumno(claveInfoAlumno, programaEducativo.getCvePrograma(), claveAsignatura, semestres.get(j).getClaveSemestre());
                    int estado = -1;
                    if(asignatura!=null){
                        estado = asignatura.getEstado();
                    }
                    String idAsString = "'"+id+"'";
                    formularioRegistro += "<td>"+nombreAsignatura+"</td>\n" +
"                            <td>\n" +
"                                <select name=\"selectorEstado\" id=\""+id+"\" onchange=\"mostrarSelectorProfesor("+idAsString+")\">\n" +
"                                    <option value=\"\">Seleccionar Asignatura</option>\n" +
"                                    <option value=\"0\" ";
                    if(asignatura!=null && estado==0){
                        formularioRegistro += "SELECTED";
                    }
                    formularioRegistro += ">Aprobada</option>\n" +
"                                    <option value=\"1\" ";
                    if(asignatura!=null && estado==1){
                        formularioRegistro += "SELECTED";
                    }
                    formularioRegistro += ">Recursable</option>\n" +
"                                    <option value=\"2\" ";
                    if(asignatura!=null && estado==2){
                        formularioRegistro += "SELECTED";
                    }
                    formularioRegistro += ">No cursable</option>\n" +
"                                    <option value=\"-1\" ";
                    if(asignatura!=null && estado==-1){
                        formularioRegistro += "SELECTED";
                    }
                    formularioRegistro += ">Cursable</option>\n" +
"                                </select>\n" +
"                                <div id='espacio"+id+"'>\n";
                    if((estado == 0 || estado == 1 || estado == 2) && asignatura != null){
                        formularioRegistro += "<select name=\"selectorProfesor\" id=\"selectorProfesor"+id+"\">\n";
                        for(int k = 0; k < profesores.size(); k++){
                            String nombreProfesor = profesores.get(k).getNombre();
                            int claveProfesor = profesores.get(k).getClaveProfesor();
                            formularioRegistro += "<option value=\""+claveProfesor+"\" ";
                            if(claveProfesor == asignatura.getClaveProfesor()){
                                formularioRegistro += "SELECTED";
                            }
                            formularioRegistro += ">"+nombreProfesor+"</option>\n";
                        }
                    }
                    formularioRegistro +=
"                               </div>\n" +
"                            </td>\n";
                }
            }
            formularioRegistro += "                    </tr>\n";
        }    
        formularioRegistro +=
"                </table>\n" +
"                </div>\n" +
"                <br>\n" +
"                <h2>Tabla Optativas</h2>\n";
        
        DAOAsignaturasOptativasAlumno daoAOA = new DAOAsignaturasOptativasAlumno();    
        ArrayList<AsignaturaOptativa> optativas = programaEducativo.getReticula().getAsignaturasOptativas();
        if(optativas!=null && optativas.size()>0){
            int numfilasO = optativas.size();
            formularioRegistro +=
"                <table class=\"estiloAsignaturasAlumno\" border=\"1\" cellpadding=\"10\" id=\"tablaOptativas\" filas=\""+numfilasO+"\">\n" +
"                    <tr>\n" +
"                        <th colspan=\"2\">Optativas</th>\n" +
"                    </tr>\n";
            for(int i = 0; i<numfilasO; i++){
                String nombreOptativa = optativas.get(i).getNombre();
                String idOptativa = "op"+i;
                
                DAOAsignaturaOptativa daoAsignaturaOptativa = new DAOAsignaturaOptativa();
                int claveAsignaturaOptativa = daoAsignaturaOptativa.obtenerClaveAsignaturaOptativa(optativas.get(i).getClaveAsignatura(), programaEducativo.getCvePrograma());
                
                
                AsignaturaOptativaAlumno actual = daoAOA.obtenerAsignaturaAlumno(claveInfoAlumno, programaEducativo.getCvePrograma(), claveAsignaturaOptativa);
                int estadoO = -1;
                if(actual!=null){
                    estadoO = actual.getEstado();
                }
                String idOpAsString = "'"+idOptativa+"'";


                formularioRegistro +=
"                        <tr>\n" +
"                            <td>"+nombreOptativa+"</td>\n" +
"                            <td>\n" +
"                                <select name=\"selectorEstado\" id=\""+idOptativa+"\" onchange=\"mostrarSelectorProfesorOptativa("+idOpAsString+")\">\n" +
"                                    <option value=\"\">Seleccionar Asignatura</option>\n" +
"                                    <option value=\"0\" ";
                if(actual!=null && estadoO==0){
                    formularioRegistro += "SELECTED";
                }
                formularioRegistro += ">Aprobada</option>\n" +
"                                    <option value=\"1\" ";
                if(actual!=null && estadoO==1){
                    formularioRegistro += "SELECTED";
                }
                formularioRegistro += ">Recursable</option>\n" +
"                                    <option value=\"2\" ";
                if(actual!=null && estadoO==2){
                    formularioRegistro += "SELECTED";
                }
                formularioRegistro += ">No cursable</option>\n" +
"                                    <option value=\"-1\" ";
                if(actual!=null && estadoO==-1){
                    formularioRegistro += "SELECTED";
                }
                formularioRegistro += ">Cursable</option>\n" +
"                                </select>\n" +
"                                <div id='espacio"+idOptativa+"'>\n";
                if((estadoO == 0 || estadoO == 1 || estadoO == 2) && actual != null){
                    formularioRegistro += "<select name=\"selectorProfesor\" id=\"selectorProfesor"+idOptativa+"\">";
                    for(int k = 0; k < profesores.size(); k++){
                        String nombreProfesor = profesores.get(k).getNombre();
                        int claveProfesor = profesores.get(k).getClaveProfesor();
                        formularioRegistro += "<option value=\""+claveProfesor+"\" ";
                        if(claveProfesor == actual.getClaveProfesor()){
                            formularioRegistro += "SELECTED";
                        }
                        formularioRegistro += ">"+nombreProfesor+"</option>\n";
                    }
                }
                formularioRegistro +=
"                                </div>\n" +
"                            </td>\n" +
"                        </tr>";
            }
            formularioRegistro +=
"                </table>\n" +
"                </div>\n" +
"                <br>";
        }
        daoP.cerrarConexionAProfesor();
        daoIA.cerrarConexionADAOInformacionAlumno();
        daoR.cerrarConexionARelacionAlumnoProgramaEducativo();
        daoAA.cerrarConexionAAsignaturaAlumno();
        daoAOA.cerrarConexionAAsignaturaOptativaAlumno();

        formularioRegistro +=
"        <input type=\"button\" id=\"guardar\" value=\"Guardar\" onClick=\"enviarDatosAsignaturasAlumno();\"/>\n" +
"        <input type=\"button\" id=\"regresarAlumno\" value=\"Regresar\"/ onClick=\"regresar();\">\n" +
"        <div id=\"objetivoDeLaRespuesta\"></div></div>";
        
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out=null;
        try {
            out = response.getWriter();
            out.println(formularioRegistro);
        } catch (IOException | NumberFormatException ex) {
            out.println(ex.getMessage());
        } finally {
            out.close();
        }
    }
}
